package cn.lili.modules.search.service;

import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.dos.BaseStandardPromotions;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
import cn.lili.modules.search.entity.dto.EsDeleteDTO;
import org.elasticsearch.action.update.UpdateRequest;

import java.util.List;
import java.util.Map;

/**
 * 商品索引业务层
 *
 * @author paulG
 * @since 2020/10/14
 **/
public interface EsGoodsIndexService {

    /**
     * 全局索引数据初始化
     */
    void init();

    /**
     * 获取es生成索引进度
     *
     * @return es生成索引进度
     */
    Map<String, Long> getProgress();

    /**
     * 添加商品索引
     *
     * @param goods 商品索引信息
     */
    void addIndex(EsGoodsIndex goods);

    /**
     * 添加商品索引
     *
     * @param goodsList 商品索引信息
     */
    void addIndex(List<EsGoodsIndex> goodsList);

    /**
     * 更新商品索引
     *
     * @param goods 商品索引信息
     */
    void updateIndex(EsGoodsIndex goods);

    /**
     * 更新商品索引的的部分属性
     *
     * @param queryFields  查询字段
     * @param updateFields 更新字段
     */
    void updateIndex(Map<String, Object> queryFields, Map<String, Object> updateFields);

    void updateGoodsIndexByGoodsList(List<Goods> goodsList);

    void updateGoodsIndexByStore(String storeId);

    /**
     * 批量商品索引的的属性（ID 必填, 其他字段只填写更新的字段，不需要更新的字段不要填写。）
     *
     * @param goodsIndices 商品索引列表
     */
    void updateBulkIndex(List<EsGoodsIndex> goodsIndices);

    /**
     * 删除索引
     *
     * @param queryFields 查询条件 (key 为字段，value为字段值)
     * @param clazz       索引类型
     */
    void deleteIndex(Map<String, Object> queryFields, Class<?> clazz);

    /**
     * 删除索引
     *
     * @param id 商品索引信息
     */
    void deleteIndexById(String id);

    /**
     * 删除索引
     *
     * @param ids 商品索引id集合
     * @param clazz       索引类型
     */
    void deleteIndexByIds(List<String> ids);

    /**
     * 删除索引
     *
     * @param esDeleteDTO 删除索引DTO
     */
    void deleteIndex(EsDeleteDTO esDeleteDTO);

    /**
     * 初始化商品索引
     *
     * @param goodsIndexList   商品索引列表
     * @param regeneratorIndex 是否重新生成索引
     * @param scene            场景
     */
    void initIndex(List<EsGoodsIndex> goodsIndexList, boolean regeneratorIndex, String scene);

    /**
     * 更新商品索引的促销信息
     *
     * @param id        id(skuId)
     * @param promotion 促销信息
     * @param key       促销信息的key
     */
    UpdateRequest updateEsGoodsIndexPromotions(String id, BaseStandardPromotions promotion, String key);

    /**
     * 更新商品索引的促销信息
     *
     * @param ids       id(skuId)
     * @param promotion 促销信息
     * @param key       促销信息的key
     */
    void updateEsGoodsIndexPromotions(List<String> ids, BaseStandardPromotions promotion, String key);

    /**
     * 根据列表更新商品索引的促销信息
     *
     * @param promotionGoodsList 促销商品列表
     * @param promotion          促销信息
     * @param key                促销信息的key
     */
    void updateEsGoodsIndexByList(List<PromotionGoods> promotionGoodsList, BaseStandardPromotions promotion, String key);

    /**
     * 更新全部商品索引的促销信息
     *
     * @param promotion 促销信息
     * @param key       促销信息的key
     */
    void updateEsGoodsIndexAllByList(BaseStandardPromotions promotion, String key);

    /**
     * 删除索引中指定的促销活动id的促销活动
     *
     * @param skuIds        商品skuId
     * @param promotionsKey 促销活动Key
     */
    void deleteEsGoodsPromotionByPromotionKey(List<String> skuIds, String promotionsKey);


    /**
     * 删除索引中指定的促销活动id的促销活动
     *
     * @param promotionsKey 促销活动Key
     */
    void deleteEsGoodsPromotionByPromotionKey(String promotionsKey);

    /**
     * 清除所以商品索引的无效促销活动
     */
    void cleanInvalidPromotion();

    /**
     * 根据id获取商品索引信息
     *
     * @param id skuId
     * @param clazz      索引类型
     * @return 商品索引信息
     */
    <T> T findIndexById(String id, Class<T> clazz);

    /**
     * 根据id获取商品索引信息
     *
     * @param id skuId
     * @return 商品索引信息
     */
    EsGoodsIndex findEsGoodsIndexById(String id);

    /**
     * 根据sku创建临时的EsGoodsIndex，该EsGoodsIndex对象不会写es库
     * @param goodsSku
     * @return
     */
    EsGoodsIndex createTempData(GoodsSku goodsSku);


    EsGoodsIndex createTempData(String skuId);


    /**
     * 根据id获取商品索引信息的促销信息
     *
     * @param id skuId
     * @return 促销信息map
     */
    Map<String, Object> getPromotionMap(String id);

    /**
     * 根据id获取商品索引信息的指定促销活动的id
     *
     * @param id                skuId
     * @param promotionTypeEnum 促销活动类型
     * @return 当前商品参与的促销活动id集合
     */
    List<String> getPromotionIdByPromotionType(String id, PromotionTypeEnum promotionTypeEnum);

    /**
     * 获取重置的商品索引
     *
     * @param goodsSku       商品sku信息
     * @return 商品索引
     */
    EsGoodsIndex getResetEsGoodsIndex(GoodsSku goodsSku);

}
